package main

import "fmt"

// main
//
//	@Description: channel
//
// 本质就是一个数据结构-队列FIFO
// 是一个线程安全的，保证了多协程访问时，队列数据的安全
// channel是有类型的，一个string的channel只能存放string类型的数据
func main() {
	channelBaseUse()
	//channelStruct()
	//channelInterface()
}

// channelBaseUse
//
//	@Description: 基本使用：引用类型
func channelBaseUse() {
	var ch1 chan int
	ch1 = make(chan int, 3)
	fmt.Printf("len=%d  cap=%d\n", len(ch1), cap(ch1))

	ch1 <- 11
	ch1 <- 12
	ch1 <- 13
	fmt.Printf("len=%d  cap=%d\n", len(ch1), cap(ch1))

	num1 := <-ch1
	fmt.Println("num1=", num1)
	fmt.Printf("len=%d  cap=%d\n", len(ch1), cap(ch1))

	ch1 <- 14
	fmt.Printf("len=%d  cap=%d\n", len(ch1), cap(ch1))

	//管道内元素len=3 不可再放入数据
	//ch1 <- 15//fatal error: all goroutines are asleep - deadlock!
	//fmt.Printf("len=%d  cap=%d\n", len(ch1), cap(ch1))

	num2 := <-ch1
	fmt.Println("num2=", num2)
	num3 := <-ch1
	fmt.Println("num3=", num3)
	num4 := <-ch1
	fmt.Println("num4=", num4)

	fmt.Printf("len=%d  cap=%d\n", len(ch1), cap(ch1))
	//管道内元素len=0 不可再取数据
	//num5 := <-ch1 //fatal error: all goroutines are asleep - deadlock!
	//fmt.Println("num5=", num5)
}

// channelStruct
//
//	@Description: 管道-放入结构体
func channelStruct() {
	var ch chan Stu = make(chan Stu, 3)
	ch <- Stu{Name: "TOM", Age: 18}
	ch <- Stu{Name: "JACK", Age: 20}

	stu := <-ch
	fmt.Println(stu)
}

// channelMap
//
//	@Description:
func channelMap() {
	var ch chan map[string]string = make(chan map[string]string)
	m1 := make(map[string]string, 10)
	m1["city1"] = "chongqing"
	ch <- m1

	m2 := make(map[string]string, 10)
	m2["name"] = "zhangsan"
	ch <- m2

	v1 := <-ch
	fmt.Println("v=", v1)

	v2 := <-ch
	fmt.Println("v=", v2)

}

// channelInterface
//
//	@Description:
func channelInterface() {
	var ch chan interface{}
	ch = make(chan interface{}, 5)
	ch <- 10
	ch <- 11
	ch <- "tom"
	ch <- Stu{"tom", 10}

	//扔掉一个数据（10）
	<-ch

	v1 := <-ch
	fmt.Println("v=", v1)
	v2 := <-ch
	fmt.Println("v=", v2)
	v3 := <-ch
	fmt.Printf("v=%v  %T \n", v3, v3) //v={tom 10}  main.Stu
	//类型断言-assert
	st := v3.(Stu)
	fmt.Printf("name=%s \n", st.Name)

}

type Stu struct {
	Name string
	Age  int
}
